﻿// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "FLL/chapter6/逐顶点光照"
{
    Properties
    {
        _Diffuse("[漫反射] diffuse",Color)=(1,1,1,1)
    }
    SubShader
    {
        pass{
            //声明这个pass的光照模式
            Tags{"LightMode"="ForwardBase"}

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag 
            // 需要使用unity内置的一些变量 _LightMode0
            #include "Lighting.cginc"   
  
            fixed4 _Diffuse;
            struct a2v{
                float4 vertex:POSITION;
                float3 normal:NORMAL;
            };
            struct v2f{
                float4 pos:SV_POSITION;
                fixed3 color:Color;    
            };
            
            // 因为是逐顶点光照它是在顶点着色器里计算的颜色,然后其他像素的颜色是在光栅化的时候插值生成
            v2f vert(a2v v){
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);

                //获得环境光颜色
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                //fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                //Transform the normal fram object space to world space
                //将法线方向从模型空间转化到世界空间
                fixed3 worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                //fixed3 worldNormal = normalize(mul((float3x3)_Object2world，v.normal);

                //获得世界空间的光源方向
                fixed3 worldLight=normalize(_WorldSpaceLightPos0.xyz);

                //物体漫反射颜色=光源颜色*物体表面颜色*Lambert公式算出来的物体表面光源强度
                fixed3 diffuse=_LightColor0.rbg*_Diffuse.rgb*saturate(dot(worldLight,worldNormal));
                
                //最终颜色=环境光+物体漫反射颜色
                o.color=ambient+diffuse;

                return o;
            }

            fixed4 frag(v2f i):SV_TARGET{
                return fixed4(i.color,1.0);
            }


            ENDCG
        }
 
    }
    FallBack "Diffuse"
}
